PTPSER page# 0001 next
2: COMMENT ⊗   VALID 00017 PAGES
3: C REC  PAGE   DESCRIPTION
4: C00001 00001
5: C00004 00002    BEGIN   PTPSER ↔ SUBTTL PTPSER - PAPER TAPE PUNCH SERVICE ROUTINES
6: C00006 00003     PTP SERVICE DISPATCH TABLE
7: C00007 00004     INITIALIZE CODE, RESET ALL REGISTERS
8: C00009 00005     ARE YOU HUNG UP? AH, ER, ARE YOU HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP?     HUNG UP?        HUNG UP?
9: C00011 00006     2-PROCESSOR ROUTINES
10: C00012 00007     ROUTINE TO SET BITS IN IOS AND START DEVICE
11: C00015 00008     CLOCK INTERRUPT ROUTINES FOR PTP
12: C00017 00009     OUTPUT ROUTINES ARE DIVIDED INTO PARTS AND KINDS, DEPENDING ON
13: C00019 00010     IN THIS MODE, WE BRING 1 CHAR PER WORD IN AND PACK 4 TO A WORD
14: C00022 00011     THIS IS FOR REAL BINARY MODE, WITH CHECKSUMS AND ALL
15: C00024 00012     HERE, WE TRY TO FIT THE USER'S BUFFER INTO SYSTEM CORE
16: C00027 00013     COME HERE IF WE HAVE TO DO 2 SEPARATE BLT'S
17: C00029 00014     THIS ROUTINE SETS UP THE CRAZY DISPATCHES FOR EACH OF THE VARIOUS MODES OF OPERATION
18: C00033 00015     INTERRUPT SERVICE ROUTINES - OBOYOBOYOBOY!
19: C00036 00016     TYPE 2 - PUNCH PARITY AND DELETES AFTER CR, FF, VT AND  HT
20: C00038 00017     LAST PAGE - PUNCH FEED HOLES, SHUT OFF PTP
21: C00042 ENDMK
22: C⊗;
    PTPSER page# 0002 next  prev
24: BEGIN   PTPSERSUBTTL PTPSER - PAPER TAPE PUNCH SERVICE ROUTINES
25: ; ROUTINES DESIGNED TO SERVE DUAL-PROCESSOR PUNCH SYSTEM
26: 
27: ; PARAMETER ASSIGNMENTS . . .
28: 
29: ; ACCUMULATORS
30:         A←TAC
31:         B←TAC1
32:         C←AC1
33:         D←DAT
34:         COUNT←AC2
35:         POINTR←AC3
36: 
37: ; IOS BITS
38:         PTPFT←←200              ; FEED AFTER EVERY BUFFERLOAD IS PUNCHED
39:         PTPEN1←←2000            ; LAST BUFFERLOAD, FEED WHEN DONE
40:         PTPPDN←←4000            ; PUNCH DELETE CODE NEXT
41:         PTPERR←←10000           ; DEVICE PTP HUNG BIT
42:         PTPBG1←←20000           ; SPECIAL 2ND LEVEL IOBEG FLAG
43: 
44: ; CONO BITS . . .
45:         PTPDON←←10              ; DONE FLAG
46:         PTPNOT←←100             ; 'OUT OF TAPE' FLAG
47: 
    PTPSER page# 0003 next  prev
49: ; PTP SERVICE DISPATCH TABLE
50: 
51:         JRST PTPINI             ; INITIALIZE
52:         JRST PTPCLT             ; HUNG TIME OUT, SET ERROR BIT
53: PTPDSP:
54:         JRST PTPREL
55:         JRST PTPCLS             ; CLOSE
56:         JRST PTPOUT             ; OUTPUT
57:         JRST ILLINP             ; INPUT ?????
58: 
59: PTPREL: MOVSI IOS,DEVSBB+PTPERR
60:         ANDCAM IOS,PTPIOS
61:         POPJ PDP,
    PTPSER page# 0004 next  prev
63: ; INITIALIZE CODE, RESET ALL REGISTERS
64: 
65: PTPINI: MOVE A,[XWD PTPIBP,PTPIBP+1]
66:         SETZM PTPIBP            ; SET UP BLT POINTER TO ZERO PTPDDB
67:         BLT A,PTPCSC            ; FROM DEVOAD TO END OF PTPDDB
68:         SYNINI PTPCSC           ; CLEAR CONTROL CELLS TOO
69:         SKIPE P2NUM             ; DO WE HAVE A 2-PROCESSOR SYSTEM?
70:         SETOM PTPMOD            ; SET THE MODE FLAG IF WE DO
71:         CONO PTP,0              ; SETTLE PTP CONTROL REGISTER
72:         HLLZS   PTPCN1
73:         HLLZS   PTPCN2
74:         MOVEI   TAC,PTPCN1      ;ASSUME P1
75:         SKIPE   PTPMOD          ;P1?
76:         MOVEI   TAC,PTPCN2      ;NO. USING P2
77:         MOVEM   TAC,PTPCON      ;SET ADDRESS OF INTERRUPT CHAIN CONSZ
78:         POPJ    P,
79: 
80: ; CLOSE CODE
81: 
82: PTPCLS: SETZ A,                 ; SET THE 'LAST UUO' BIT IN IOS
83:         HRLZI IOS,IOEND         ; THIS BIT
84:         PUSHJ PDP,PTPSOS        ; THIS ROUTINE HANDLES THAT
85:         JRST OUT
86: 
87: ; PTP OUTPUT CODE
88: 
89: PTPOUT: TLNE IOS,IOBEG          ; FIRST UUO?
90:         TLZ IOS,PTPERR          ; YES, ZERO HUNG DEVICE BIT
91:         TLNE IOS,PTPERR         ; CHECK FOR HUNG DEVICE
92:         JRST PTPHNG
93: PTPO2:  TLZE IOS,IOBEG          ; FIRST OUTPUT?
94:         JRST PTPSUD             ; YES, FIGURE OUT CONFIGURATION NOW
95: PTPO1:  JRST @PTPUDS            ; EACH MODE HAS A DIFFERENT ROUTINE
96: 
    PTPSER page# 0005 next  prev
98: ; ARE YOU HUNG UP? AH, ER, ARE YOU HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP?     HUNG UP?        HUNG UP?
99: 
100: PTPHNG: PUSHJ PDP,HNGSTP        ; PRINT 'DEVICE PTP OK?' AND HANG HIM UP
101:         SETZ IOS,               ; DON'T SET ANYTHING
102:         HRLZI A,PTPERR+DEVSBB   ; GOTTA CLEAR  ERROR FLAG NOW
103:         PUSHJ PDP,PTPSOD        ; AFTER IT'S OVER, START UP AGAIN
104:         JRST PTPO2
105: 
106: ; COME HERE IF THE CLOCK TICKS
107: 
108: PTPCLT: MOVEI DEVDAT,PTPDDB     ; SET UP THIS FOR SETIOD
109:         HRLZI IOS,PTPERR        ; ERROR BIT WE WANT TO SET
110:         SKIPE P2NUM             ; IS P2 ACTIVE?
111:         JRST PTPCL1             ; YES, DO SOMETHING
112:         CONO PI,PTPOFF          ; SHUT OFF PTP
113:         ORB IOS,PTPIOS          ; OR IN ERROR BIT
114:      TLZE IOS,IOW            ; ARE WE IN AN IO WAIT?
115:         PUSHJ PDP,STTIOD        ; YES, GET US OUT!
116:         MOVEM IOS,PTPIOS        ; RESTORE IOS
117:         CONO PI,PTPON           ; SPEED UP PTP, EVEN THOUGH IT IS HUNG
118:         JRST CPOPJ1             ; SKIP RETURN, DON'T EXCITE HNGCHK
119: 
120: PTPCL1: MOVEI B,1               ; WE ARE P1
121:         PSYNC PTPCSC            ; GET CONTROL OF IOS
122:         ORB IOS,PTPIOS          ; OR IN ERROR BIT
123:         TLZE IOS,IOW            ; ARE WE IN IO WAIT?
124:         PUSHJ PDP,STTIOD        ; YES, GET US OUT!!
125:         MOVEM IOS,PTPIOS        ; RESTORE IOS
126:         AOS (PDP)               ; SET TO SKIP RETURN
127:         MOVEI B,1               ; RESTORE WHAT SETIOD CLOBBERED
128:         XSYNC PTPCSC            ; RELEASE CONTROL OF IOS
129:         POPJ PDP,
    PTPSER page# 0006 next  prev
131: ; 2-PROCESSOR ROUTINES
132: ; SET AND CLEAR BITS IN IOS
133: ; PUT BITS YOU WANT SET IN IOS, BITS YOU WANT CLEARED IN A (IN TAC)
134: 
135: PTPSOS: SKIPE PTPMOD            ; ARE WE IN 1 OR 2 PROCESSOR MODE
136:         JRST PTPS1              ; 2-PROCESSORS, HARDER
137:         CONO PI,PTPOFF          ; SLOW DOWN PTP
138:         ANDCAM A,PTPIOS         ; ZERO OUT BITS IN A
139:         ORB IOS,PTPIOS          ; OR BITS BACK IN
140:         CONO PI,PTPON           ; SPEED UP PTP
141:         POPJ PDP,
142: 
143: PTPS1:  MOVEM A,PTPPTR          ; SAVE THIS ACCUMULATOR
144:         MOVEI B,1               ; WE ARE P1
145:         PSYNC PTPCSC            ; GET CONTROL OF IOS
146:         OR IOS,PTPIOS           ; OR IN IOS BITS
147:         ANDCM IOS,PTPPTR        ; TAKE OUT REQUESTED BITS
148:         MOVEM IOS,PTPIOS        ; RESTORE IOS
149:         XSYNC PTPCSC
150:         POPJ PDP,
    PTPSER page# 0007 next  prev
152: ; ROUTINE TO SET BITS IN IOS AND START DEVICE
153: 
154: PTPSTD: SETZB A,IOS             ; START DEVICE, SET NO IOS BITS
155: PTPSOD: OR IOS,[XWD IO,0]       ; FIRST, OR IN OUTPUT BIT
156:         LDB C,PDVTIM            ; AND SET HUNG COUNT
157:         DPB C,PDVCNT
158:         SKIPE PTPMOD            ; ARE WE RUNNING 1 OR 2 PROCESSORS TODAY?
159:         JRST PTPSD1             ; 2 PROCESSORS
160:         MOVEI B,PTPDON+PTPNOT   ; ASK FOR INTERRUPTS UPON DONE OR OUT OF PAPER
161:         CONO PI,PTPOFF          ; SHUT OF PTP IF IT IS RUNNING
162:         OR IOS,PTPIOS           ; PUT BITS INTO IOS
163:         ANDCM IOS,A             ; TAKE BITS OUT
164:         TLOE IOS,DEVSBB         ; IS THE PTP ALREADY RUNNING?
165:         JRST PTPSD2             ; YES, SKIP IT
166:         HRRM B,@PTPCON          ; SET INTERRUPT LOCATION
167:         CONO PTP,PTPDON+PTPCHN  ; ASK FOR A DONE INTERRUPT, SET PI CHANNEL
168: PTPSD2: MOVEM IOS,PTPIOS        ; RESTORE IOS
169:         CONO PI,PTPON           ; SPEED UP PTP, WILL INTERRUPT NOW
170:         POPJ PDP,
171: 
172: PTPSD1: MOVEM A,PTPPTR          ; SAVE THE BITS WE ARE TO CLEAR
173:         PSYNC PTPCSC            ; GET CONTROL OF IOS
174:         OR IOS,PTPIOS
175:         ANDCM IOS,PTPPTR        ; CLEAR APPROPRIATE BITS
176:         TLON IOS,DEVSBB         ; SET DEVICE RUNNING NOW BIT.
177:         SETOM PTPACT            ; ASK P2 TO START PTP SINCE IT'S NOT ALREADY ON.
178:         MOVEM IOS,PTPIOS        ; RESTORE IOS
179:         XSYNC PTPCSC            ; RELEASE CONTROL OF IOS
180:         POPJ PDP,
181: 
182: ; ROUTINE TO SET BITS IN IOS, START DEVICE, AND WAIT FOR
183: ; DEVICE TO FINISH
184: 
185: PTPIOW: SETZB A,IOS
186: PTPSOW: PUSHJ PDP,PTPSOD        ; STORE IOS BITS AND START DEVICE
187:         JRST WSYNC              ; WAIT FOR DEVICE TO FINISH
    PTPSER page# 0008 next  prev
189: ; CLOCK INTERRUPT ROUTINES FOR PTP
190: 
191: 
192: ;PDP-10 HERE WHEN PDP-6 HAS FINISHED BUFFER
193: PTPP1: SETZM   PTPSID          ;CLEAR REQUEST
194:         MOVEI DEVDAT,PTPDDB     ; GET ADDRESS OF DEVICE DDP FOR SETIO
195:         JRST STTIOD             ; SET IO WAIT SATISFIED BIT
196: 
197: ;PDP-6 HERE WHEN PDP-10 HAS SET PTPACT
198: PTPP2: MOVE TAC,PTPACT         ; ARE WE TO START THE DEVICE FOR P1?
199:         JUMPE TAC,CPOPJ
200:         SETZM PTPACT            ; YES, FLAG IT STARTED
201:         MOVEI DEVDAT,PTPDDB     ; SET UP DEVDAT FOR PDVTIM
202:         CONO PI,PTPOFF          ; SHUT OFF PTP
203:         HRLZI IOS,IO            ; SET OUTPUT BIT IN IOS
204:         OR IOS,PTPIOS
205:         MOVEI C,PTPDON+PTPNOT   ; ASK FOR INTERRUPTS UPON DONE OR OUT OF PAPER
206: ;       TLOE IOS,DEVSBB         ; IS PTP ALREADY RUNNING?
207: ;       JRST PTPP2A             ; YES, QUIT NOW
208:         MOVEM IOS,PTPIOS        ; NO, STORE IOS
209:         CONO PTP,PTPDON+PTPCHN  ; AND ASK FOR DONE INTERRUPT FROM PTP
210:         HRRM C,@PTPCON          ; SET UP CONSO LOCATION
211: PTPP2A: CONO PI,PTPON           ; RESTORE PI CHANNEL
212:         LDB C,PDVTIM            ; RESET HUNG COUNT
213:         DPB C,PDVCNT
214:         POPJ PDP,
    PTPSER page# 0009 next  prev
216: ; OUTPUT ROUTINES ARE DIVIDED INTO PARTS AND KINDS, DEPENDING ON
217: ; MODE OF OPERATION AND OTHER SUCH STUFF
218: 
219: PTPK1:  MOVEI A,5               ; SET UP CHARS PER WORD AS 5, ASCII MODE
220:         CAIA
221: PTPK3:  MOVEI A,6               ; BINARY MODE, 6 PER WORD
222:         MOVEM A,PTPCPW          ; CHARACTERS PER WORD
223: PTPK1F: PUSHJ PDP,DEVSTU        ; SET UP COUNT AND POINTR TO USER'S CORE
224:         JRST PTPK1A
225:         PUSHJ PDP,PTPBBI        ; BLT BUFFER INTO SYSTEM CORE
226:         JRST PTPK1B             ; NO ROOM IN THE INN . . .
227:         PUSHJ PDP,ADVBFE        ; FIT AS MANY BUFFERS IN NOW AS IS POSSIBLE
228:         JRST PTPK1A
229:         JRST PTPK1F
230: 
231: PTPK1B: PUSHJ PDP,PTPIOW        ; ASK TO START DEVICE AND WAIT
232:         JRST PTPK1F
233: 
234: PTPK2A:
235: PTPK1A: SKIPGE PTPBCN           ; IS SYSTEM BUFFER EMPTY?
236:         JRST PTPK1C             ; NO, START DEVICE AND LEAVE
237:         TLNN IOS,IOEND          ; LAST UUO?
238:         POPJ PDP,               ; NO, LET HIM GIVE ANOTHER ONE
239: PTPK1D: SETZ A,                 ; SET THE 'PTP DISCONNECT' BIT IN IOS
240:         HRLZI IOS,PTPEN1        ; TELLS INTERRUPT SERVICE TO FEED A LITTLE
241:         JRST PTPSOD             ; START DEVICE AND LEAVE
242: 
243: PTPK1C: TLNE IOS,IOEND          ; LAST UUO?
244:         JRST PTPK1D             ; YES, GO START DEVICE
245:         PUSHJ PDP,DEVCR         ; DOES HE HAVE ANOTHER BUFFER TO FILL
246:         JRST PTPIOW             ; NO, WAIT FIRST AND THEN LEAVE
247:         JRST PTPSTD             ; START DEVICE AND LEAVE
248: 
    PTPSER page# 0010 next  prev
250: ; IN THIS MODE, WE BRING 1 CHAR PER WORD IN AND PACK 4 TO A WORD
251: ; IN THE SYSTEM BUFFER
252: 
253: PTPK2:  PUSHJ PDP,DEVSTU        ; SET UP POINTR TO USER BUFFER
254:         JRST PTPK2A             ; NOTHING THERE, LEAVE
255:         CAILE COUNT,PTPBLN      ; IF'N HE'S ASK'N MORE'N WE GOT . . .
256:         JRST BTLERR             ; FUCK'M!
257:         MOVN A,PTPBCN           ; IS THERE ROOM IN THE INN?
258:         ADD A,COUNT             ; ADD IN NUMBER OF WORDS TO BE TRANSFERRED
259:         CAIL A,4*PTPBLN         ; COMPARE WITH TOTAL CHAR COUNT
260:         JRST PTPK2B             ; CAN'T DO IT, LEAVE
261:         MOVSI A,(<POINT =8,0>)  ; SET UP POINTER TO SYSTEM BUFFER
262:         HLLZ B,PTPUBP           ; GET POINTER THAT IS ALREADY THERE
263:         JUMPN B,.+2             ; IF NOT ALREADY SET UP . . .
264:         HLLM A,PTPUBP           ; SET IT UP!!
265:         MOVEI B,1
266:         PSYNC PTPCSC
267: 
268:         MOVE B,PTPUBP           ; BRING UP TO AN ACCUMULATOR FOR SPEED
269: PTPK2C: MOVE A,B                ; CHECK FOR WRAP-AROUND
270:         IBP A
271:         HRRZS A                 ; GET THE NEXT POINTED TO ADDRESS
272:         CAIL A,PTPBUF+PTPBLN    ; RUN OFF END OF BUFFER?
273:         MOVE B,[POINT =8,PTPBUF]
274: 
275:         MOVE A,(POINTR)         ; PICK UP CHARACTER (WORD)
276:         IDPB A,B                ; PACK INTO SYSTEM BUFFER
277:         SOS PTPBCN              ; UPDATE CHARACTER COUNT
278:         AOJ POINTR,             ; UPDATE USER CORE POINTER
279:         SOJG COUNT,PTPK2C       ; LOOP AROUND
280: 
281:         MOVEM B,PTPUBP          ; STORE THIS BACK FOR NEXT TIME
282:         MOVEI B,1
283:         XSYNC PTPCSC
284:         PUSHJ PDP,ADVBFE        ; LOAD IN ANOTHER BUFFER IF POSSIBLE
285:         JRST PTPK2A             ; NOT POSSIBLE, EXIT
286:         JRST PTPK2              ; GO THROUGH THE ENTIRE BIT AGAIN
287: 
288: PTPK2B: PUSHJ PDP,PTPIOW        ; START DEVICE AND WAIT UNTIL IT IS FINISHED
289:         JRST PTPK2              ; THEN TRY AGAIN!!
290: 
    PTPSER page# 0011 next  prev
292: ; THIS IS FOR REAL BINARY MODE, WITH CHECKSUMS AND ALL
293: ; BLT IN A SINGLE BUFFER, PUNCH IT, THEN PUNCH CHECKSUM AND FEEDER
294: ; AFTER EVERY SINGLE BUFFERLOAD!
295: 
296: PTPK4:  HRRZ TAC1,PTPADR        ; SET UP ADDRESS
297:         PUSHJ PDP,CKS12         ; CALCULATE CHECKSUM OF BUFFER
298:         ADDI TAC1,@PTPADR       ; GET ADDRESS OF FIRST WORD OF DATA
299:         HLLM TAC,@TAC1          ; PUT THE CHECKSUM NEXT TO THE WORD COUNT
300:         PUSHJ PDP,DEVSTU        ; SET UP POINTR AND COUNT
301:         JRST PTPK4A             ; NO BUFFERS TO EMPTY?
302:         AOJ COUNT,              ; FUDGE BY ONE TO LEAVE ROOM FOR CHECKSUM AND WORD COUNT WORD
303:         SOJ POINTR,             ; BACK POINTER UP BY ONE TOO
304:         MOVEI A,6               ; BINARY MODE, 6 CHARS PER WORD
305:         MOVEM A,PTPCPW
306:         PUSHJ PDP,PTPBBI        ; BRING IN A SINGLE BUFFER
307:         JSP DAT,UERROR          ; THERE BETTER BE ROOM!!
308:         SKIPGE PTPBCN           ; ANYTHING IN BUFFER?
309:         JRST PTPK4B             ; YES, PUNCH IT
310: PTPK4C: PUSHJ PDP,ADVBFE        ; NO, IS THERE ANOTHER BUFFER?
311:         POPJ PDP,               ; NO, LET HIM FILL ONE
312:         JRST PTPK4              ; YES, BRING IT IN
313: 
314: PTPK4A: TLNE IOS,IOEND          ; LAST UUO?
315:         JRST PTPK1D             ; YES, SHUDDER!
316:         POPJ PDP,               ; NO, LET HIM FILL SOME BUFFERS
317: 
318: PTPK4B: HRLZI IOS,PTPFT         ; THIS IS A 'FEED-WHEN-TERMINATING' SITUATION
319:         SETZ A,                 ; SO TELL THE INTERRUPT SERVICE ABOUT IT
320:         PUSHJ PDP,PTPSOW        ; START DEVICE AND WAIT FOR IT TO STOP
321:         JRST PTPK4C             ; LOOP BACK AGAIN AND AGAIN
322: 
    PTPSER page# 0012 next  prev
324: ; HERE, WE TRY TO FIT THE USER'S BUFFER INTO SYSTEM CORE
325: 
326: PTPBBI: JUMPE COUNT,CPOPJ1      ; ZERO-LENGTH BUFFER IS AN AUTOMATIC SUCCESS
327:         CAILE COUNT,PTPBLN      ; SEE IF HE WANTS MORE THAN WE CAN GIVE
328:         JRST BTLERR             ; YES, SCREW HIM!
329:         MOVEI B,1
330:         SKIPE PTPMOD            ; FAST OR SLOW MODE?
331:         JRST PTPZZ0
332:         CONO PI,PTPOFF  ; FAST MODE, DO CONO DIRECTLY
333:         JRST PTPZZ1
334: PTPZZ0: PSYNC PTPCSC
335: PTPZZ1: MOVE A,PTPIBP           ; PICK UP INTERRUPT LEVEL BYTE POINTER
336:         IBP A                   ; THIS IS TO GET THE DISTANCE, IN WORDS, BETWEEN THE TWO POINTERS
337:         HRRZS A                 ; WHICH IS THE NUMBER OF AVAILABLE WORDS IN THE BUFFER
338:         MOVEI B,PTPBUF+PTPBLN   ; WE ALSO NEED THE DISTANCE TO THE END OF THE BUFFER
339:         SUB B,PTPUBP            ; FOR WRAP-AROUND PURPOSES
340:         SUB A,PTPUBP            ; DISTANCE BETWEEN POINTERS
341:         JUMPLE A,PTPBB6         ; POINTER WRAP-AROUND, SPECIAL CASE
342: PTPBB5: CAMGE A,COUNT           ; SEE IF THERE IS ULTIMATLY ROOM
343:         JRST PTPBB7             ; NO, FAILURE
344:         JUMPE B,PTPBB2          ; IF ZERO, IT IS A SPECIAL CASE
345:         HRLZ C,POINTR           ; SET UP BLT WORD. SOURCE IS USER CORE
346:         HRR C,PTPUBP            ; DESTINATION IS SYSTEM CORE
347:         CAMLE COUNT,B           ; NOW WE DECIDE WHETHER WE MUST WRAP AROUND
348:         JRST PTPBB1             ; YES, GO WRAP IT UP
349:         HRRZ B,PTPUBP           ; NO, GET LAST WORD TO BE TRANSFERRED
350:         ADD B,COUNT             ; BY ADDING THE SOURCE AND THE COUNT
351:         BLT C,-1(B)             ; AND SUBTRACTING ONE AT INDEX TIME
352:         ADDM COUNT,PTPUBP       ; UPDATE BUFFER CHARACTER POINTER
353: PTPBB3: IMUL COUNT,PTPCPW       ; UPDATE BUFFER CHARACTER COUNT TOO
354:         SUB COUNT,PTPBCN        ; SUBTRACT OFF CURRENT COUNT
355:         MOVNM COUNT,PTPBCN      ; CORRECT SIGN AND STORE
356:         AOS (PDP)               ; SET TO SKIP, SUCCESS
357: PTPBB7: SKIPE PTPMOD
358:         JRST PTPZZ3
359:         CONO PI,PTPON
360:         POPJ PDP,
361: PTPZZ3: XSYNC PTPCSC
362:         POPJ PDP,
    PTPSER page# 0013 next  prev
364: ; COME HERE IF WE HAVE TO DO 2 SEPARATE BLT'S
365: 
366: PTPBB1: BLT C,PTPBUF+PTPBLN-1   ; FIRST BLT, TO END OF SYSTEM BUFFER
367: PTPBB2: MOVE C,COUNT            ; PICK UP WORD COUNT
368:         SUB C,B                 ; THIS IS NUMBER OF WORDS LEFT TO TRANSFER
369:         ADDI B,(POINTR)         ; THIS IS PLACE TO START TRANSFERRING FROM
370:         HRLZS B                 ; SWAP IT
371:         HRRI B,PTPBUF           ; DESTINATION IS START OF BUFFER
372:         BLT B,PTPBUF-1(C)       ; TRANSFER REMAINDER OF BUFFER
373:         HRROI C,-PTPBLN(COUNT)  ; WORD COUNT, WRAPPED AROUND
374:         ADDM C,PTPUBP           ; UPDATE POINTER
375:         JRST PTPBB3
376: 
377: ; COME HERE IF THE DIFFERENCE OF THE TWO POINTERS IS NEGATIVE
378: 
379: PTPBB6: JUMPN A,.+2             ; IF NON-ZERO, NOTHING TO WORRY ABOUT
380:         SKIPN PTPBCN            ; ZERO. HMMM. IF COUNT IS NOT ZERO, THEN THERE IS NO ROOM IN THE INN!!
381:         ADDI A,PTPBLN           ; ADD IN TOTAL BUFFER LENGTH
382:         JRST PTPBB5
    PTPSER page# 0014 next  prev
384: ; THIS ROUTINE SETS UP THE CRAZY DISPATCHES FOR EACH OF THE VARIOUS MODES OF OPERATION
385: 
386: PTPSUD: PUSHJ PDP,PTPINI        ; INITIALIZE TABLES
387:         ANDI IOS,117            ; LEAVE ONLY THE MODE BITS IN IOS
388:         TLO IOS,IO+PTPBG1       ; SET OUTPUT BIT AND FEED BIT
389:         MOVEM IOS,DEVIOS(DEVDAT)
390:         LDB A,PIOMOD            ; PICK UP MODE BITS, BOTTOM 4 BITS IN IOS
391:         JUMPE A,PTPSKA          ; MODES 0 AND 1 ARE IDENTICAL
392:         CAIN A,1
393:         JRST PTPSKA
394:         CAIN A,10               ; MODE 10 - IMAGE MODE, 1 BYTE PER WORD
395:         JRST PTPSKB
396:         CAIN A,13               ; MODE 13 - BINARY, NO CHECKSUMMING
397:         JRST PTPSKC
398:         CAIN A,14               ; MODE 14 - BINARY WITH CHECKSUMMING
399:         JRST PTPSKD
400:         JSP DAT,UERROR          ; IT REALLY CAN'T GET HERE.  - CAN IT?
401: 
402: PTPSKA: MOVEI A,PTPK1           ; UUO LEVEL KIND 1
403:         MOVE C,[POINT 7,PTPBUF] ; 7-BIT BYTES AT INTERRUPT LEVEL
404:         MOVEI B,PTPT2           ; INTERRUPT LEVEL TYPE 2
405:         TRNE IOS,100            ; CHECK FOR ALTERNATE MODES
406:         MOVEI B,PTPT1           ; INT. LEVEL TYPE 1 - NON-PARITY 8TH HOLE, NO DELETES AFTER TABS
407: PTPSKE: MOVEM A,PTPUDS          ; UUO-LEVEL DISPATCH ADDRESS
408:         MOVEM B,PTPIDS          ; INTERRUPT-LEVEL DISPATCH ADDRESS
409:         MOVEM C,PTPIBP          ; INTERRUPD-LEVEL BYTE POINTER
410:         MOVEI A,PTPBUF          ; SET UP UUO-LEVEL BUFFER POINTER
411:         MOVEM A,PTPUBP          ; NOT A BYTE POINTER, JUST AN ADDRESS
412:         SETZM PTPBCN            ; BUFFER IS EMPTY, CLEAR COUNT
413:         JRST PTPO1              ; RETURN TO OUTPUT ROUTINE
414: 
415: PTPSKB: MOVEI A,PTPK2           ; UUO LEVEL KIND 2, PACK USER BUFFER INTO SYSTEM BUFFER
416:         MOVEI B,PTPT3           ; INT LEVEL TYPE 3, 8-BIT BYTES
417:         MOVE C,[POINT =8,PTPBUF]
418:         JRST PTPSKE
419: 
420: PTPSKC: MOVEI A,PTPK3           ; UUO LEVEL KIND 3, BINARY MODES
421:         MOVEI B,PTPT1           ; INT. LEVEL TYPE 1, PUNCH 8TH HOLE
422:         MOVE C,[POINT 6,PTPBUF] ; 6-BIT BYTES, 6 TO A WORD
423:         TRNE IOS,100            ; THIS EFFECTS THE ANAL-CRANIAL INVERSION
424:         MOVEI B,PTPT3           ; THIS MEANS DON'T PUNCH 7TH OR 8TH HOLE AT ALL
425:         JRST PTPSKE
426: 
427: PTPSKD: TRNE IOS,100
428:         JRST PTPSKC             ; 100 BIT HERE MEANS SOMETHING ENTIRELY DIFFERENT
429:         MOVEI A,PTPK4           ; UUO LEVEL KIND 4, CHECKSUMM A LOT
430:         MOVEI B,PTPT1           ; INT. LEVEL TYPE 1, PUT IN 8TH HOLE ALWAYS
431:         MOVE C,[POINT 6,PTPBUF] ; SET FOR 6-BIT BYTES
432:         JRST PTPSKE
433: 
    PTPSER page# 0015 next  prev
435: ; INTERRUPT SERVICE ROUTINES - OBOYOBOYOBOY!
436: 
437: PTPINT:
438:         JSR @PTPSAV             ; SAVE ACCUMULATORS FIRST
439:         MOVEI DEVDAT,PTPDDB     ; SET UP DEVDAT FOR EVERYBODY'S BENEFIT
440:         SKIPE PTPFCN            ; ANY FEED COUNT LEFT?
441:         JRST PTPFED             ; GO PUNCH A FEED HOLE OR TWO
442:         MOVEI B,2               ; WE ARE P2
443:         SKIPN PTPMOD            ; MUST WE SYNCHRONIZE?
444:         JRST PTPZZ2             ; NO, SKIP IT
445:         PSYNC PTPCSC
446: PTPZZ2: MOVE IOS,PTPIOS         ; WE HAVE TO INSPECT THIS FIRST
447:         TLZE IOS,PTPBG1         ; IS THIS THE FIRST BUFFERLOAD?
448:         JRST PTPF1              ; YES, WE SHOULD PUNCH FEED FIRST
449:         TLZE IOS,PTPPDN         ; DO WE HAVE A DANGLING DELETE?
450:         JRST PTPIDN             ; YES, GO PUNCH IT
451:         SKIPN PTPBCN            ; IS THERE ANYTHING IN THE SYSTEM BUFFER?
452:         JRST PTPOF              ; NO, QUIT AND GO HOME
453:         AOS PTPBCN              ; DECREMENT CHAR COUNT
454:         MOVE D,PTPIBP           ; PICK UP BYTE POINTER
455:         IBP D                   ; INCREMENT POINTER TO CHECK FOR WRAP-AROUND
456:         HRRZ C,D                ; GET ADDRESS PORTION
457:         CAIL C,PTPBUF+PTPBLN    ; IS BYTE POINTER OUT OF RANGE?
458:         HRRI D,PTPBUF           ; YES, RESET ADDRESS TO START OF BUFFER
459:         LDB C,D                 ; PICK UP CHARACTER
460:         MOVEM D,PTPIBP          ; REPLACE BYTE POINTER
461:         JRST @PTPIDS            ; AND PUNCH IT CORRECTLY
462: 
463: PTPT1:  ORI C,200               ; TYPE 1 - ALWAYS PUNCH 8TH HOLE
464: PTPT3:  DATAO PTP,C             ; TYPE 3 - NO MODIFICATION AT ALL
465:         LDB C,PDVTIM            ; SET HUNG COUNT
466:         DPB C,PDVCNT
467: PTPXIT: MOVEM IOS,PTPIOS        ; THIS PROCESSOR OWNS IOS
468:         SKIPN PTPMOD
469:         POPJ PDP,
470:         XSYNC PTPCSC
471:         POPJ PDP,
    PTPSER page# 0016 next  prev
473: ; TYPE 2 - PUNCH PARITY AND DELETES AFTER CR, FF, VT AND  HT
474: 
475: PTPT2:  JUMPE C,PTPT3           ; TYPE 2 - PARITY AND DELETES AFTER THESE CHARACTERS
476:         CAIE C,15               ; C.R. RATES A DELETE
477:         CAIN C,11               ; V.T. RATES A DELETE FOR THE LOSING ASR35
478:         TLO IOS,PTPPDN          ; PUNCH DELETE NEXT TIME AROUND
479:         CAIN C,13               ; V.T.
480:         TLO IOS,PTPPDN
481:         CAIN C,14               ; F.F. MEANS PUNCH A LOT OF FEED
482:         JRST PTP2A
483: PTP2B:  MOVE D,C                ; NOW COMPUTE PARITY ON THE CHARACTER
484:         IMULI D,200401          ; MAKE 3 COPIES OF THE NUMBER
485:         AND D,[11111111]        ; MAKES ONE COPY OF EACH BIT, EVERY 3RD BIT. NUMBER IS NOW SPREAD OUT
486:         IMUL D,[11111111]       ; ADD UP BITS IN LH
487:         TLNE D,10               ; NOW, DO WE NEED PARITY?
488:         IORI C,200              ; YES, INSERT IT
489:         JRST PTPT3              ; AND PUNCH CHAR
490: 
491: PTP2A:  MOVNI D,30              ; PUNCH 30 FEED HOLES
492:         MOVEM D,PTPFCN          ; SET THIS IN OUR REGISTER
493:         JRST PTP2B              ; AND RETURN TO CALCULATE PARITY
494: 
    PTPSER page# 0017 next  prev
496: ; LAST PAGE - PUNCH FEED HOLES, SHUT OFF PTP
497: 
498: PTPF2:  MOVNI C,30              ; PUNCH 30 HOLES FOR MODE 14
499:         CAIA
500: PTPF1:  MOVNI C,100             ; STANDARD INITIAL AND FINAL FEED
501:         MOVEM C,PTPFCN          ; INTO FEED COUNT REGISTER
502:         MOVEM IOS,PTPIOS        ; STORE IOS
503:         SKIPN PTPMOD
504:         JRST PTPFED
505:         XSYNC PTPCSC            ; SLOW MODE, RELEAS CONTROL OF IOS
506: PTPFED: AOS PTPFCN              ; DECREMENT FEED COUNT
507:         DATAO PTP,[0]           ; GIVE IT A FEED WORD
508:         LDB C,PDVTIM            ; SET HUNG COUNT
509:         DPB C,PDVCNT
510:         POPJ PDP,               ; AND LEAVE
511: 
512: PTPIDN: MOVEI C,377             ; PUNCH A DELETE, FLAG HAS BEEN CLEARED
513:         JRST PTPT3
514: 
515: PTPOF:  TLZE IOS,PTPEN1         ; OH MAMA, CAN THIS REALLY BE THE END?
516:         JRST PTPF1              ; IT IS, FEED BEFORE LEAVING
517:         TLZE IOS,PTPFT          ; IS THIS THE 'FEED WHEN TERMINATING' BIT?
518:         JRST PTPF2              ; YES, DO IT
519:         CONO PTP,0              ; CLEAR PTP REGISTERS
520:         HLLZS @PTPCON           ; DON'T CONFUSE INTERRUPT SERVICE DISPATCHES
521:         SKIPE PTPMOD            ; ARE WE IN FAST OR SLOW MODE?
522:         JRST PTPOF1             ; SLOW MODE, SET A FLAG FOR P1 TO SEE
523:         TLZE IOS,IOW            ; ARE WE IN AN IO WAIT?
524:         PUSHJ PDP,STTIOD        ; YES, SET IO DONE
525: PTPOF2: TLZ IOS,DEVSBB          ; CLEAR BUSY FLAG, ALTHOUGH NOONE LOOKS AT IT
526:         SETZM PTPBCN            ; BUFFER IS NOW EMPTY, MARK IT AS SUCH!
527:         JRST PTPXIT
528: 
529: PTPOF1: TLZE IOS,IOW            ; ARE WE IN AN IO WAIT?
530:         SETOM PTPSID            ; YES, ASK TO CALL SETIOD FOR US
531:         JRST PTPOF2
532: 
533: BEND PTPSER
 EOF: PTPSER end-of-file. cnt=16